package 多线程;

/**
 * 奇偶数字打印器
 * 使用两个线程交替打印奇数和偶数
 * 使用synchronized和wait/notify机制实现线程同步
 */
public class OddEvenPrinter {
    private Object moniter = new Object(); // 同步监视器对象
    private final int limit; // 打印的上限值
    private volatile int count; // 当前打印的数字，使用volatile保证可见性

    /**
     * 构造函数
     * @param intCount 起始数字
     * @param times 打印次数上限
     */
    OddEvenPrinter(int intCount, int times){
        this.count = intCount;
        this.limit = times;
    }

    /**
     * 打印方法
     * 使用synchronized和wait/notify机制实现线程同步
     * 每个线程打印一个数字后，通知另一个线程继续打印
     */
    private void print(){
        synchronized(moniter){ // 获取同步锁
            while(count < limit){ // 当未达到打印上限时继续打印
                try {
                    // 打印当前线程名称和递增后的数字
                    System.out.println(String.format("thread [%s] print number: %d", 
                        Thread.currentThread().getName(), ++count));
                    moniter.notifyAll(); // 通知其他等待的线程
                    moniter.wait(); // 当前线程等待
                } catch (InterruptedException e) {
                    e.printStackTrace(); // 打印中断异常堆栈
                }
            }
            moniter.notifyAll(); // 打印完成后通知所有等待的线程
        }
    }

    /**
     * 主函数
     * 创建两个线程分别打印奇数和偶数
     */
    public static void main(String[] args) {
        OddEvenPrinter printer = new OddEvenPrinter(0, 10); // 创建打印器实例，从0开始打印到10
        new Thread(printer::print, "odd").start(); // 创建并启动奇数打印线程
        new Thread(printer::print, "even").start(); // 创建并启动偶数打印线程
    }
}
